package aaa.analyzer;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class ParserXMLHandler extends DefaultHandler {

	// nom des tags XML
	private static final String ITEM = "item";
	private static final String GUID = "guid";
	private static final String TITLE = "title";
	private static final String DESCRIPTION = "description";
	private static final String PUBDATE = "pubDate";

	// Array list de feeds	
	private ArrayList<Feed> feeds;

	// Boolean permettant de savoir si nous sommes � l'int�rieur d'un item
	private boolean inItem;

	// Feed courant
	private Feed currentFeed;

	// Buffer permettant de contenir les donn�es d'un tag XML
	private StringBuffer buffer;

	@Override
	public void processingInstruction(String target, String data) throws SAXException {		
		super.processingInstruction(target, data);
	}

	public ParserXMLHandler() {
		super();		
	}


	// * Cette m�thode est appel�e par le parser une et une seule  
	// * fois au d�marrage de l'analyse de votre flux xml. 
	// * Elle est appel�e avant toutes les autres m�thodes de l'interface,  
	// * � l'exception unique, �videmment, de la m�thode setDocumentLocator. 
	// * Cet �v�nement devrait vous permettre d'initialiser tout ce qui doit 
	// * l'�tre avant led�but du parcours du document.

	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		this.feeds = new ArrayList<Feed>();

	}

	/* 
	 * Fonction �tant d�clench�e lorsque le parser trouve un tag XML
	 * C'est cette m�thode que nous allons utiliser pour instancier un nouveau feed
	 */
	@Override
	public void startElement(String uri, String localName, String name,	Attributes attributes) throws SAXException {
		// Nous r�initialisons le buffer a chaque fois qu'il rencontre un item
		this.buffer = new StringBuffer();		

		// Ci dessous, localName contient le nom du tag rencontr�

		// Nous avons rencontr� un tag ITEM, il faut donc instancier un nouveau feed
		if (localName.equalsIgnoreCase(ITEM)){			
			this.currentFeed = new Feed();
			this.inItem = true;
		}

		// Vous pouvez d�finir des actions � effectuer pour chaque item rencontr�
		if (localName.equalsIgnoreCase(GUID)){
			// Nothing to do	
		}
		if (localName.equalsIgnoreCase(TITLE)){
			// Nothing to do	
		}
		if (localName.equalsIgnoreCase(PUBDATE)){	
			// Nothing to do	
		}
		if(localName.equalsIgnoreCase(DESCRIPTION)){
			// Nothing to do	
		}
	}


	// * Fonction �tant d�clench�e lorsque le parser � pars� 	
	// * l'int�rieur de la balise XML La m�thode characters  
	// * a donc fait son ouvrage et tous les caract�re inclus 
	// * dans la balise en cours sont copi�s dans le buffer 
	// * On peut donc tranquillement les r�cup�rer pour compl�ter
	// * notre objet currentFeed

	@Override
	public void endElement(String uri, String localName, String name) throws SAXException {	

		if (localName.equalsIgnoreCase(GUID)){
			if(this.inItem){				
				// Les caract�res sont dans l'objet buffer
				// buffer will also contain the jsessionid (why ?)
				// we only want to add the guid number without the jsession id
				int p = this.buffer.indexOf(";") ;
				if (p != -1) this.buffer = this.buffer.delete(p, this.buffer.length()) ; 
				this.currentFeed.setId(Integer.parseInt(this.buffer.toString()));				
				this.buffer = null;
			}
		}

		if (localName.equalsIgnoreCase(TITLE)){
			if(this.inItem){				
				// Les caract�res sont dans l'objet buffer
				this.currentFeed.setTitle(this.buffer.toString());				
				this.buffer = null;
			}
		}

		if (localName.equalsIgnoreCase(PUBDATE)){	
			if(this.inItem){				
				this.currentFeed.setPubDate(this.buffer.toString());				
				this.buffer = null;
			}
		}

		if(localName.equalsIgnoreCase(DESCRIPTION)){
			if(this.inItem){				
				this.currentFeed.setDescription(this.buffer.toString());				
				this.buffer = null;
			}
		}
		if (localName.equalsIgnoreCase(ITEM)){		
			this.feeds.add(this.currentFeed);
			this.inItem = false;
		}
	}

	// * Tout ce qui est dans l'arborescence mais n'est pas partie  
	// * int�grante d'un tag, d�clenche la lev�e de cet �v�nement.  
	// * En g�n�ral, cet �v�nement est donc lev� tout simplement 
	// * par la pr�sence de texte entre la balise d'ouverture et 
	// * la balise de fermeture
	@Override
	public void characters(char[] ch,int start, int length) {		
		String lecture = new String(ch,start,length);
		if(this.buffer != null) this.buffer.append(lecture);
	}


	// cette m�thode nous permettra de r�cup�rer les donn�es
	public ArrayList<Feed> getData(){
		return this.feeds;

	}
}
